home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / 92052tar.gz / 920528.tar / arpfile.c < prev    next >
C/C++ Source or Header  |  1991-05-29  |  3KB  |  115 lines

  1. /* @(#) $Header: arpfile.c,v 1.7 91/05/29 12:01:34 deyke Exp $ */
  2.  
  3. #include <stdio.h>
  4.  
  5. #include "global.h"
  6. #include "timer.h"
  7. #include "arp.h"
  8.  
  9. #define ARP_FILE_VERSION   2
  10. #define ARP_SAVETIME       (60L*10)
  11.  
  12. struct arp_saverecord_0 {
  13.   int32 ip_addr;        /* IP address, host order */
  14.   int16 hardware;       /* Hardware type */
  15.   int16 hwalen;         /* Length of hardware address */
  16.   char  pub;            /* Publish this entry? */
  17. };
  18.  
  19. struct arp_saverecord_1 {
  20.   int32 ip_addr;        /* IP address, host order */
  21.   char  hardware;       /* Hardware type */
  22.   char  pub;            /* Publish this entry? */
  23. };
  24.  
  25. struct arp_saverecord_2 {
  26.   int32 ip_addr;        /* IP address, host order */
  27.   char  hardware;       /* Hardware type */
  28.   char  pub;            /* Publish this entry? */
  29.   int32 expires;
  30. };
  31.  
  32. static char  arp_filename[] = "/tcp/arp_data";
  33. static char  arp_tmpfilename[] = "/tcp/arp_tmp";
  34.  
  35. /*---------------------------------------------------------------------------*/
  36.  
  37. void arp_savefile()
  38. {
  39.  
  40.   FILE * fp;
  41.   int  i;
  42.   static long  nextsavetime;
  43.   struct arp_saverecord_2 buf;
  44.   struct arp_tab *p;
  45.  
  46.   if (!nextsavetime) nextsavetime = secclock() + ARP_SAVETIME;
  47.   if (Debug || nextsavetime > secclock()) return;
  48.   nextsavetime = secclock() + ARP_SAVETIME;
  49.   if (!(fp = fopen(arp_tmpfilename, "w"))) return;
  50.   putc(ARP_FILE_VERSION, fp);
  51.   for (i = 0; i < HASHMOD; i++)
  52.     for (p = Arp_tab[i]; p; p = p->next)
  53.       if (p->hw_addr && p->state == ARP_VALID && run_timer(&p->timer)) {
  54.     buf.ip_addr = p->ip_addr;
  55.     buf.hardware = p->hardware;
  56.     buf.pub = p->pub;
  57.     buf.expires = secclock() + read_timer(&p->timer) / 1000;
  58.     fwrite((char *) &buf, sizeof(buf), 1, fp);
  59.     fwrite(p->hw_addr, Arp_type[p->hardware].hwalen, 1, fp);
  60.       }
  61.   fclose(fp);
  62.   rename(arp_tmpfilename, arp_filename);
  63. }
  64.  
  65. /*---------------------------------------------------------------------------*/
  66.  
  67. void arp_loadfile()
  68. {
  69.  
  70.   FILE * fp;
  71.   char  hw_addr[MAXHWALEN];
  72.   int32 ttl;
  73.   static int  done;
  74.   struct arp_tab *p;
  75.  
  76.   if (done) return;
  77.   done = 1;
  78.   if (Debug || !(fp = fopen(arp_filename, "r"))) return;
  79.   switch (getc(fp)) {
  80.   case 0:
  81.     {
  82.       struct arp_saverecord_0 buf;
  83.       while (fread((char *) &buf, sizeof(buf), 1, fp) &&
  84.          buf.hardware < NHWTYPES &&
  85.          fread(hw_addr, buf.hwalen, 1, fp))
  86.     arp_add(buf.ip_addr, buf.hardware, hw_addr, buf.pub);
  87.     }
  88.     break;
  89.   case 1:
  90.     {
  91.       struct arp_saverecord_1 buf;
  92.       while (fread((char *) &buf, sizeof(buf), 1, fp) &&
  93.          buf.hardware < NHWTYPES &&
  94.          fread(hw_addr, Arp_type[buf.hardware].hwalen, 1, fp))
  95.     arp_add(buf.ip_addr, buf.hardware, hw_addr, buf.pub);
  96.     }
  97.     break;
  98.   case 2:
  99.     {
  100.       struct arp_saverecord_2 buf;
  101.       while (fread((char *) &buf, sizeof(buf), 1, fp) &&
  102.          buf.hardware < NHWTYPES &&
  103.          fread(hw_addr, Arp_type[buf.hardware].hwalen, 1, fp))
  104.     if ((ttl = buf.expires - secclock()) > 0 &&
  105.         (p = arp_add(buf.ip_addr, buf.hardware, hw_addr, buf.pub))) {
  106.       set_timer(&p->timer, ttl * 1000);
  107.       start_timer(&p->timer);
  108.     }
  109.     }
  110.     break;
  111.   }
  112.   fclose(fp);
  113. }
  114.  
  115.